\section{使用PHP操作MySQL} % (fold)
\label{sec:使用php操作mysql}
从PHP 5和MySQL 4.1起，可以使用更新的Improved MySQL函数（称为mysqli扩展）。这些函数提供了改进的性能并且利用了其他特性（还带来了其他好处）。强烈建议使用mysqli扩展操作MySQL，而不是早期的连接方式。

\subsection{连接到MySQL} % (fold)
\label{sub:连接到mysql}
与MySQL交互时，第一步（连接到服务器）需要适当命名的mysqli\_connect()函数：

\begin{lstlisting}
$dbc = mysqli_connect (hostname, username, password, db_name);
\end{lstlisting}

前三个参数（主机、用户名和密码）基于MySQL内建立的用户和特权（见附录A，以了解更多信息）。通常（但并非总是这样），主机值是localhost。第四个参数是要使用的数据库的名称。这相当于在MySQL客户端内使用USE databasename命令。

如果建立了连接，\$dbc变量（database connection的简写）将成为所有后续数据库交互的一个参考点。用于处理MySQL的大多数PHP函数都可以把这个变量作为它的第一个参数。

如果发生一个连接问题，可以调用mysqli\_connect\_error()，它返回连接错误消息。它不带参数。


\begin{lstlisting}
$dbc = @mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) OR die ('Could not connect to   MySQL: ' . mysqli_connect_error() );
\end{lstlisting}

在函数调用前面放置一个错误控制运算符（@），可以防止在Web浏览器中显示PHP错误。这是一种首选的做法，因为错误将由OR die()子句处理。

\subsection{指定数据集编码方式} % (fold)
\label{sub:指定数据集编码方式}
连接到数据库后，我们还需要设置在数据库间传输字符时所用的默认字符编码。
\begin{lstlisting}
mysqli_set_charset($dbc, 'utf8');
\end{lstlisting}

\subsection{执行查询} % (fold)
\label{sub:执行查询}
一旦你成功地连接到并选择一个数据库，就可以开始执行查询。这些查询可以是诸如插入、更新和删除之类的基本查询，或者是返回许多行的复杂联结中所涉及的查询。无论如何，用于执行查询的PHP函数都是mysqli\_query()：

\begin{lstlisting}
$result = mysqli_query(dbc, query);
\end{lstlisting}

\subsection{检索查询结果} % (fold)
\label{sub:检索查询结果}
处理SELECT查询结果的主要工具是mysqli\_fetch\_array()，它带有一个查询结果变量，并以数组格式一次返回一行数据。你将希望在一个循环内使用这个函数，只要有更多的行，循环就会持续访问返回的每一行。从查询中读取每条记录的基本构造如下：

\begin{lstlisting}
while ($row = mysqli_fetch_array($r)) {
 // Do something with $row.
 }
\end{lstlisting}

mysqli\_fetch\_array()函数带有一个可选的参数，用于指定返回的数组的类型：关联数组、索引数组，或者这两者。建议使用关联数组，这样即使表结构或者查询发生变化，它也会继续工作。

使用mysqli\_fetch\_array()函数时，可以采取的一个可选的步骤是：一旦使用查询结果信息完成了工作，即可释放这些信息：

\begin{lstlisting}
mysqli_free_result ($r);
\end{lstlisting}

这一行会消除\$r占用的系统开销（内存）。该步骤是可选的，因为PHP将在脚本末尾自动释放资源，但是就像使用mysqli\_close()一样，这是一种良好的编程风格。

\subsection{关闭MySQL连接} % (fold)
\label{sub:关闭mysql连接}
你的脚本中的最后（虽然是可选的）一步是，一旦使用完现有的MySQL连接，就要关闭它：

\begin{lstlisting}
mysqli_close($dbc);
\end{lstlisting}

这个函数不是必需的，因为在脚本的末尾，PHP会自动关闭连接，但是纳入这个函数确实是一种良好的编程风格。
% subsection 关闭mysql连接 (end)
